Skip to main content

准备与验证

网上能查到的几位曾跟着 CS140e 写过学习笔记的前辈都是使用 18 年第一版,而之后的 19、20 以至于正在编写的 21 版都将语言换成了 C,自然也就享受不到 Sergio Benitez 的优美 rust 代码,虽然 18 版仍然可以在Sergio 的网站找到,但两年过去了,里面的很多代码已经不适合现在的 rust 了。 抛开语言不谈,CS140e-20win 的第一个 LED 闪烁实验我反复尝试也无法成功是让我最为困扰的事,这个实验仅仅使用了树莓派官方固件和一个二进制可执行文件,但启动后检测不到任何 GPIO 电平变化,act 指示灯也是上电约一秒后熄灭,没有出现规律闪烁的情况,丝毫没有头绪。 经过又一番查找我发现了 Gatech CS3210 课程同样是使用 rust 为树莓派编写简易操作系统,从Acknowledgments和课程内容也能看出这门课程吸取了不少 CS140e 的优点,于是我马上把课程资料拉下来将同样是 LED 闪烁的第一个实验写入内存卡上电就成功了。

关于编辑器

我最初使用的编辑器是 VScode,随着代码越来越复杂 VScode 本身已经不能满足要求,目前在社区中公认的组合是 VScode+Rust Analyzer,在安装了插件后报错,我查到是因为RA 不支持 Cargo 的旧版本,为了避免因为升级工具链出现问题,我尝试仅更新 Cargo,rustup 的自定义工具链功能恰好可以在缺失 Cargo 时自动使用新版。最终我从工具链中卸载 Cargo 再将它作为自定义工具链加入 rustup,达到了仅使用最新版 Cargo 的效果。当然,也可以选择安装旧版本的 Rust Analyzer。

source Because the rust-lang/rust tree does not include Cargo, when cargo is invoked for a custom toolchain and it is not available, rustup will attempt to use cargo from one of the release channels, preferring 'nightly', then 'beta' or 'stable'.

树莓派启动过程

  1. 上电启动,GPU读取内部ROM代码并执行
  2. GPU查找 SD 卡中第一个可识别的FAT分区,读取根目录bootcode.bin文件到内部Cache并执行,用于初始化 ram
  3. GPU读取根目录start.elf文件到内存并执行,用于分配内存
  4. GPU读取根目录kernel.img文件到内存
  5. GPU唤醒CPU

这里的kernel.img通常就是操作系统内核,我在之前的使用中仅仅接触过更换内核和修改启动参数,但是在这个课程中我是直接把编译好的二进制可执行文件命名为kernel.img放入根目录,也就是所谓的裸机。